﻿namespace CP.Test
{
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.Text;
    using Microsoft.VisualStudio.TestTools.UnitTesting;

    [TestClass]
    public class CallOrderTest
    {
        /// <summary>
        /// 派生类静态字段被实例化。
        /// 派生类静态构造函数被调用。
        /// 派生类实例成员字段被实例化。
        /// 基类静态字段被实例化。
        /// 基类静态构造函数被调用。
        /// 基类实例成员字段被实例化。
        /// 基类构造函数被调用。
        /// 派生类构造函数被调用。
        /// </summary>
        [TestMethod]
        public void ClassCallOrderTest()
        {
            Derived derivedObject = new Derived();
        }

        public class Description
        {
            public Description(string info)
            {
                Console.WriteLine(info);
            }
        }

        public class Base
        {
            private static Description baseStaticField = new Description("基类静态字段被实例化。");
            private Description baseInstanceField = new Description("基类实例成员字段被实例化。");

            static Base()
            {
                Console.WriteLine("基类静态构造函数被调用。");
            }

            public Base()
            {
                Console.WriteLine("基类构造函数被调用。");
            }
        }

        public class Derived : Base
        {
            private static Description derivedStaticField = new Description("派生类静态字段被实例化。");
            private Description derivedInstanceField = new Description("派生类实例成员字段被实例化。");

            static Derived()
            {
                Console.WriteLine("派生类静态构造函数被调用。");
            }

            public Derived()
            {
                Console.WriteLine("派生类构造函数被调用。");
            }
        }
    }
}
